import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import numpy as np
from datetime import datetime
import os

# 1. 数据准备（示例数据，实际使用时替换为真实数据）
# 生成更真实的货运数据
np.random.seed(42)
dates = pd.date_range(start='2023-06-01', end='2023-06-30')
customers = ['A公司', 'B公司', 'C公司', 'D公司']
materials = ['矿粉', '水泥']
locations = ['北京', '上海', '广州', '深圳']
plates = ['京A12345', '沪B67890', '粤C13579', '粤D24680', '京E11223']

# 创建DataFrame
data = []
for date in dates:
    for _ in range(8):  # 每天8条运输记录
        material = np.random.choice(materials, p=[0.6, 0.4])
        customer = np.random.choice(customers, p=[0.4, 0.3, 0.2, 0.1])
        location = np.random.choice(locations, p=[0.4, 0.3, 0.2, 0.1])
        plate = np.random.choice(plates)
        
        # 根据物料类型生成不同的货运量
        if material == '矿粉':
            tonnage = int(np.random.normal(150, 30))
        else:
            tonnage = int(np.random.normal(120, 25))
            
        data.append([date, material, customer, location, plate, tonnage])

df = pd.DataFrame(data, columns=['date', 'material_type', 'customer', 'ship_from', 'license_plate', 'tonnage'])

# 2. 创建分析目录结构
os.makedirs('analysis_results/charts', exist_ok=True)
os.makedirs('project卢鹤/练习一', exist_ok=True)

# 3. 分析函数
def plot_daily_trend(data, material, color, filename):
    """绘制日趋势图"""
    daily = data[data['material_type'] == material].groupby('date')['tonnage'].sum()
    
    plt.figure(figsize=(14, 6))
    plt.bar(daily.index, daily, color=color, width=0.8)
    plt.title(f'6月份{material}货运量日趋势', fontsize=14, pad=20)
    plt.xlabel('日期', fontsize=12)
    plt.ylabel('货运量(吨)', fontsize=12)
    plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%m-%d'))
    plt.xticks(rotation=45)
    plt.grid(axis='y', linestyle='--', alpha=0.7)
    plt.tight_layout()
    plt.savefig(f'analysis_results/charts/{filename}', dpi=300, bbox_inches='tight')
    plt.close()
    
    return daily

# a. 矿粉货运量日趋势
mining_daily = plot_daily_trend(df, '矿粉', '#1f77b4', 'mining_daily.png')

# b. 水泥货运量日趋势
cement_daily = plot_daily_trend(df, '水泥', '#ff7f0e', 'cement_daily.png')

# c. 客户需求量分析
def analyze_customers(data):
    """客户需求分析"""
    customer_analysis = data.groupby('customer').agg({
        'tonnage': ['sum', 'mean', 'count'],
        'date': lambda x: (x.max() - x.min()).days
    })
    customer_analysis.columns = ['总货运量', '平均每次运输量', '运输次数', '合作天数']
    customer_analysis['占比'] = customer_analysis['总货运量'] / customer_analysis['总货运量'].sum()
    return customer_analysis.sort_values('总货运量', ascending=False)

customer_analysis = analyze_customers(df)

# d. 发货地分析
def analyze_locations(data):
    """发货地分析"""
    location_analysis = data.groupby('ship_from')['tonnage'].sum().sort_values(ascending=False)
    
    plt.figure(figsize=(10, 6))
    location_analysis.plot(kind='bar', color=['#2ca02c', '#d62728', '#9467bd', '#8c564b'])
    plt.title('各发货地6月货运总量', fontsize=14, pad=20)
    plt.ylabel('货运量(吨)', fontsize=12)
    plt.xticks(rotation=0)
    plt.grid(axis='y', linestyle='--', alpha=0.7)
    plt.tight_layout()
    plt.savefig('analysis_results/charts/ship_location.png', dpi=300, bbox_inches='tight')
    plt.close()
    
    return location_analysis

location_analysis = analyze_locations(df)

# e. 车牌号分析
def analyze_plates(data):
    """车辆分析"""
    plate_analysis = data.groupby('license_plate').agg({
        'tonnage': ['sum', 'mean', 'count'],
        'date': lambda x: (x.max() - x.min()).days
    })
    plate_analysis.columns = ['总货运量', '平均每次运输量', '运输次数', '运营天数']
    plate_analysis['日均运输量'] = plate_analysis['总货运量'] / plate_analysis['运营天数']
    return plate_analysis.sort_values('总货运量', ascending=False)

plate_analysis = analyze_plates(df)

# 4. 生成专业分析报告
report_content = f'''# A公司6月货运情况分析报告

**报告生成时间**: {datetime.now().strftime('%Y-%m-%d %H:%M')}

## 一、货运量总体情况

- **总运输量**: {df['tonnage'].sum():,.0f}吨
- **平均每日运输量**: {df.groupby('date')['tonnage'].sum().mean():,.0f}吨
- **运输记录总数**: {len(df):,}条

## 二、物料运输分析

### 2.1 矿粉运输情况
![矿粉日趋势](analysis_results/charts/mining_daily.png)

- **矿粉总运输量**: {df[df['material_type']=='矿粉']['tonnage'].sum():,.0f}吨
- **最高日运输量**: {mining_daily.max():,.0f}吨 ({mining_daily.idxmax().strftime('%m月%d日')})
- **最低日运输量**: {mining_daily.min():,.0f}吨 ({mining_daily.idxmin().strftime('%m月%d日')})

### 2.2 水泥运输情况
![水泥日趋势](analysis_results/charts/cement_daily.png)

- **水泥总运输量**: {df[df['material_type']=='水泥']['tonnage'].sum():,.0f}吨
- **最高日运输量**: {cement_daily.max():,.0f}吨 ({cement_daily.idxmax().strftime('%m月%d日')})

## 三、客户需求分析